package com.smart.community.commons.base;

import lombok.Data;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.io.Serializable;

/**
 * 基础查询类
 * 包含分页查询的基本参数
 * @author Wu.Liang
 * @since 2024-12-19
 * @version 2.0.0
 */
@Data
public class BaseQuery implements Serializable {
    
    private static final long serialVersionUID = 2L;
    
    /**
     * 当前页码，默认第1页
     */
    @Min(value = 1, message = "页码不能小于1")
    private Integer current = 1;
    
    /**
     * 每页大小，默认10条
     */
    @Min(value = 1, message = "每页大小不能小于1")
    @Max(value = 1000, message = "每页大小不能超过1000")
    private Integer size = 10;
    
    /**
     * 排序字段
     */
    private String orderBy;
    
    /**
     * 排序方向（asc-升序，desc-降序）
     */
    private String orderDirection = "desc";
    
    /**
     * 关键词搜索
     */
    private String keyword;
    
    /**
     * 开始时间
     */
    private String startTime;
    
    /**
     * 结束时间
     */
    private String endTime;
    
    /**
     * 状态
     */
    private Integer status;
    
    /**
     * 获取偏移量
     * 
     * @return 偏移量
     */
    public Integer getOffset() {
        return (current - 1) * size;
    }
    
    /**
     * 获取排序SQL
     * 
     * @return 排序SQL
     */
    public String getOrderBySql() {
        if (orderBy == null || orderBy.trim().isEmpty()) {
            return "";
        }
        
        String direction = "desc".equalsIgnoreCase(orderDirection) ? "DESC" : "ASC";
        return " ORDER BY " + orderBy + " " + direction;
    }
    
    /**
     * 获取当前页码（兼容性方法）
     * 
     * @return 当前页码
     */
    public Integer getPageNum() {
        return current;
    }
    
    /**
     * 获取每页大小（兼容性方法）
     * 
     * @return 每页大小
     */
    public Integer getPageSize() {
        return size;
    }
    
    /**
     * 设置当前页码（兼容性方法）
     * 
     * @param pageNum 当前页码
     */
    public void setPageNum(Integer pageNum) {
        this.current = pageNum;
    }
    
    /**
     * 设置每页大小（兼容性方法）
     * 
     * @param pageSize 每页大小
     */
    public void setPageSize(Integer pageSize) {
        this.size = pageSize;
    }
}
